﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GiaiPTbac2
{
    class PhuongTrinhBacHai
    {
        private int _a;

        public int a
        {
            get { return _a; }
            set { _a = value; }
        }

        private int _b;

        public int b
        {
            get { return _b; }
            set { _b = value; }
        }

        private int _c;

        public int c
        {
            get { return _c; }
            set { _c = value; }
        }

        double _delta;

        public double Delta
        {
            get { return _delta; }
            set { _delta = value; }
        }

        List<float> _nghiem = new List<float>();

        public List<float> Nghiem
        {
            get { return _nghiem; }
            set { _nghiem = value; }
        }

        int _soNghiem; //0-vô nghiệm, 1-có 1 nghiệm, 2-có 2 nghiệm, 3-vô số nghiệm

        public int SoNghiem
        {
            get { return _soNghiem; }
            set { _soNghiem = value; }
        }

        /// <summary>
        /// Kiểm tra xem phương trình có thoả điều kiện a#0 hay không, nếu thoả trả về true, không thoả trả về false
        /// </summary>
        public bool KiemTraDieuKien()
        {
            if (a != 0)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Khi a#0, hàm này trả về số nghiệm của phương trình bậc 2, trả về 0-vô nghiệm, 1-có 1 nghiệm, 2-có 2 nghiệm
        /// Khi a=0, trả về -1;
        /// </summary>
        /// 
        public int KiemTraSoNghiem()
        {
            _delta = b * b - 4 * a * c;
            if (this.KiemTraDieuKien())
            {
                if (_delta > 0)
                    return 2;
                if (_delta == 0)
                    return 1;
                return 0;
            }

            return -1;
        }

        /// <summary>
        /// Trả về 1 list kiểu float có 2 phần tử tương ứng 2 nghiệm của phương trình (hai nghiệm có thể bằng nhau nếu a=0 hoặc delta=0)
        /// </summary>
        /// <returns></returns>
        public List<float> TimNghiem()
        {
            _soNghiem = this.KiemTraSoNghiem();
            switch (_soNghiem)
            {
                case 1:
                    _nghiem.Add(-b /(2 * a));
                    break;
                case 2:
                    _nghiem.Add(((-1.0f * b) + (float)Math.Sqrt(_delta)) / (2 * a));
                    _nghiem.Add(((-1.0f * b) - (float)Math.Sqrt(_delta)) / (2 * a));
                    break;
                case -1:
                    PhuongTrinhBacNhat ptb1 = new PhuongTrinhBacNhat();
                    ptb1.a = _b;
                    ptb1.b = _c;
                    _soNghiem = ptb1.KiemTraSoNghiem();
                    if(_soNghiem==1)
                        _nghiem.Add(ptb1.TimNghiem());
                    break;
            }
            return _nghiem;
        }
    }
}
